package com.cskaoyan.javase.basic._2variable._4detail;

/**
 * 基本数据类型的类型转换
 * 声明是告诉编译器变量的数据类型，那么数据类型的转换，也同样是要告诉编译器怎么转换，转换成了什么数据类型。
 * 数据类型的转换分为两大类：
 *      1.自动类型转换: 指的是由编译器自动完成类型转换,程序员无需做任何额外操作.
 *      2.强制类型转换: 指的是编译器不会自动完成类型,而是由程序员手动写特殊语法来完成类型转换.
 *
 *  基本数据类型类型转换的大前提: 只有数值类型才会参与类型转换,布尔类型boolean是不参与任何类型转换的.
 *
 *
 *  自动类型转换:
 *      定义: 指的是由编译器自动完成类型转换,程序员无需做任何额外操作.
 *      发生的条件:
 *          当把一个小取值范围的变量,赋值给大取值范围的变量时
 *          编译器自动完成,是自动类型转换
 *          说白了,基本数据类型的自动类型转换是: 小 --> 大
 *      小容器中的水 --> 一个大的容器 不会出现溢出的情况,一般是比较安全的,所以编译器自动完成
 *
 *      基本数据类型的自动类型转换是绝对安全的吗?是绝对能够保证数据真实吗(不会数据失真吗)?
 *      不是的,有一定的风险(风险不大,很小,只有在及其特殊的情况下才会出现,绝大多数情况下是很安全的)
 *      因为浮点数的精度有限,所以整型-->浮点型是可能出现数据失真的
 *
 *
 *  强制类型转换:
 *      定义: 指的是编译器不会自动完成类型,而是由程序员手动写特殊语法来完成类型转换.
 *      发生的条件:
 *          大到小
 *      大容器中的水 --> 一个小的容器 绝大情况下,小的容器是不能完全装那么多水的,就会出现溢出的情况
 *      一旦溢出,对于数据而言,就会导致数据失真,所以强转的风险是很大的,不能自动完成
 *
 *      强转的特殊语法:
 *      强转后的变量数据类型名 变量名 = (强转后的变量数据类型名)被强转的变量/常量;
 *
 *
 * 以上强转和自动类型转换都是针对基本数据类型而言的,而且是基本数据类型的数值类型,布尔类型不参与
 * 扩展:
 *      引用数据类型也完全可以做类型转换,它也分为自动和强制转换两大类(具体细节面向对象再详谈.)
 *
 * @since 17:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        /*
            100默认当做int处理
            但是这里将一个int类型的值赋值给long类型变量
            这里就隐含了一次类型转换
            int --> long
            这个过程,程序员没有做任何额外操作,就是自动类型转换
         */
        long num = 100;
        // int --> double 自动类型转换
        double num2 = 100;

        int num3 = 123456789;
        // int --> float 小到大 是自动类型转换
        float num4 = num3;
        System.out.println(num4);
        double num5 = num3;
        System.out.println(num5);

        int num6 = 666;
        float num7 = num6;
        System.out.println(num7);

        double d1 = 0.1;
        // double --> float 大到小,是强制类型转换,必须程序员手动完成,编译器不会自动完成,所以编译报错
        // float d2 = 0.1;
        float d3 = (float) 0.1;
        
        /*
            强转过程中的快捷键使用
                1.alt + 回车
                2."._2cast"
                    直接在要强转的变量/常量
                    的后面写"._2cast"
                    填入相应的数据类型
                    即可完成类型转换
                3.".var"
                    开发中经常要写带有"="的表达式
                    这时建议从右往左写
                    将右边写完以后,可以用快捷键".var"自动生成左边
                    除此之外,还有一个快捷键效果类似:
                    ctrl + alt + v (这个更快)
         */
        double a1 = 1.23;
        // double --> int 
        int a2 = (int) a1;
        int a3 = (int) a1;

        byte b1 = (byte) a1;
    }
}
